home *** CD-ROM | disk | FTP | other *** search
/ TOS Silver 2000 / TOS Silver 2000.iso / programm / MM2_DEV / S / TEST / NEWSTORT.M < prev    next >
Encoding:
Text File  |  1994-03-12  |  7.0 KB  |  255 lines

  1. MODULE NewStorTest; (*$E MOS *)
  2.  
  3. (*
  4.  * Test-Programm für neues Storage-Modul
  5.  *)
  6.  
  7. FROM SYSTEM IMPORT ASSEMBLER, ADDRESS, ADR, BYTE;
  8. IMPORT StorBase, StrConv, Terminal;
  9. FROM PrgCtrl IMPORT TermProcess;
  10. FROM Storage IMPORT ALLOCATE, DEALLOCATE, MemSize, AllAvail, More;
  11.  
  12. FROM RandomGen IMPORT RandomCard;
  13.  
  14. TYPE
  15.         PtrHead = POINTER TO Head;
  16.  
  17.         HeadLink = RECORD
  18.                      n: INTEGER;  (* rel. offset von block.data *)
  19.                      p: INTEGER;  (* rel. offset von block.data *)
  20.                    END;
  21.  
  22.         Head  = RECORD;           (* werden nur für used-Bereiche benutzt *)
  23.                   hd: HeadLink;
  24.                   root: INTEGER;  (* rel. Offset von Block.data (pos.Wert) *)
  25.                   level: INTEGER;
  26.                   size: INTEGER;  (* used-Größe, kann ungerade sein!     *)
  27.                                   (* -- muß immer vor 'hd.data' stehen   *)
  28.                                   (* damit 'fullBlk' funktioniert!       *)
  29.                   data: BYTE      (* Beginn der Daten *)
  30.                 END;
  31. CONST
  32.         HeadSize = 10;            (* TSIZE (Head ohne data) *)
  33.  
  34. TYPE
  35.         PtrLink = POINTER TO Link;
  36.  
  37.         Link = RECORD
  38.                  next: PtrLink;
  39.                  prev: PtrLink;
  40.                END;
  41.  
  42.         PtrBlock = POINTER TO Block;
  43.  
  44.         Block = RECORD
  45.                   blk: Link;
  46.                   size: LONGINT;  (* Größe des verfügbaren Bereichs *)
  47.                                   (*  kann ungerade sein!           *)
  48.                                   (* Bit 30: <full>                 *)
  49.                   CASE : CARDINAL OF
  50.                   | 0: (* full *)
  51.                     level: INTEGER;
  52.                     full: CARDINAL; (* = 0, wenn full *)
  53.                     fullData: BYTE
  54.                   | 1: (* root *)
  55.                     blRov: PtrBlock (* zeigt direkt auf letzten Block *)
  56.                   | 2: (* not full *)
  57.                     hd: HeadLink;
  58.                     hdRov: INTEGER; (* letzer hd, wo alloc durchgef. wurde *)
  59.                     free: LONGINT;  (* gesamter freier Bereich in Block *)
  60.                     hds : BYTE      (* Beginn der Header/Freibereiche *)
  61.                   END
  62.                 END;
  63. CONST
  64.         BlockSize     = 22;  (* TSIZE (Block ohne hds) *)
  65.         BlockFullSize = 16;  (* TSIZE (Block, 0) *)
  66.  
  67. VAR RootPtr: PtrBlock;
  68.     Verify: PROCEDURE (): CARDINAL;
  69.  
  70.  
  71. PROCEDURE showLinks;
  72.  
  73.  
  74.   PROCEDURE abs (bl: PtrBlock; hd: INTEGER): ADDRESS;
  75.     (*$L-*)
  76.     BEGIN
  77.       ASSEMBLER
  78.           ; RETURN ADR (bl^.hds) + LONGCARD (LONG (hd))
  79.           MOVE    -(A3),D0
  80.           MOVE.L  -(A3),A0
  81.           ADDA.W  D0,A0
  82.           ADDA.W  #BlockSize,A0
  83.           MOVE.L  A0,(A3)+
  84.       END
  85.     END abs;
  86.     (*$L=*)
  87.  
  88.   PROCEDURE sizeHd (bl: PtrBlock; hd: INTEGER): INTEGER;
  89.     (*$L-*)
  90.     BEGIN
  91.       ASSEMBLER
  92.           ; hdp:= abs (bl, hd);
  93.           ; RETURN val (hdp^.size)
  94.           MOVE    -(A3),D0
  95.           MOVE.L  -(A3),A0
  96.           MOVE.W  Head.size+BlockSize(A0,D0.W),D0
  97.           ADDQ    #1,D0
  98.           ANDI    #$FFFE,D0
  99.           MOVE    D0,(A3)+
  100.       END;
  101.     END sizeHd;
  102.     (*$L=*)
  103.  
  104.   PROCEDURE blkFull (bl: PtrBlock): BOOLEAN;
  105.     (*$L-*)
  106.     BEGIN
  107.       ASSEMBLER
  108.           MOVE.L  -(A3),A0
  109.           BTST    #6,Block.size(A0)
  110.           SNE     D0
  111.           ANDI    #1,D0
  112.           MOVE    D0,(A3)+
  113.       END
  114.     END blkFull;
  115.     (*$L=*)
  116.  
  117.   PROCEDURE blkSize (bl: PtrBlock): LONGINT;
  118.     (*$L-*)
  119.     BEGIN
  120.       ASSEMBLER
  121.           MOVE.L  -(A3),A0
  122.           MOVE.L  Block.size(A0),D0
  123.           ANDI.L  #$00FFFFFF,D0
  124.           MOVE.L  D0,(A3)+
  125.       END
  126.     END blkSize;
  127.     (*$L=*)
  128.  
  129.   PROCEDURE nextHd (bl: PtrBlock; hd: INTEGER): INTEGER;
  130.     (*$L-*)
  131.     BEGIN
  132.       ASSEMBLER
  133.           ; hdp:= abs (bl, hd);
  134.           ; RETURN hdp^.hd.n
  135.           MOVE    -(A3),D0
  136.           MOVE.L  -(A3),A0
  137.           MOVE.W  Head.hd.n+BlockSize(A0,D0.W),(A3)+
  138.       END;
  139.     END nextHd;
  140.     (*$L=*)
  141.  
  142.   PROCEDURE wrabs (a: ADDRESS);
  143.     BEGIN
  144.       Terminal.WriteString (StrConv.LHexToStr (a,7))
  145.     END wrabs;
  146.  
  147.   PROCEDURE wrrel (a: LONGINT);
  148.     BEGIN
  149.       Terminal.WriteString (StrConv.IntToStr (a,5))
  150.     END wrrel;
  151.  
  152.   PROCEDURE wr (c: ARRAY OF CHAR);
  153.     BEGIN
  154.       Terminal.WriteString (c)
  155.     END wr;
  156.  
  157.   VAR line: CARDINAL;
  158.   
  159.   PROCEDURE wrln;
  160.     VAR ch: CHAR;
  161.     BEGIN
  162.       INC (line);
  163.       Terminal.WriteLn;
  164.       IF line > 22 THEN
  165.         Terminal.WriteString ('Taste...');
  166.         Terminal.Read (ch);
  167.         Terminal.WriteLn;
  168.         line:= 0;
  169.       END
  170.     END wrln;
  171.  
  172.   VAR bl: PtrBlock; hd: PtrHead; freeBeg, usedBeg: INTEGER; ch: CHAR;
  173.       l: INTEGER; ad: ADDRESS; empty: BOOLEAN;
  174.  
  175.   BEGIN
  176.     line:= 0;
  177.     Terminal.WriteString ('--------------------------------');
  178.     Terminal.WriteLn;
  179.     Terminal.WriteString ('All avail: ');
  180.     Terminal.WriteString (StrConv.CardToStr (StorBase.AllAvail(),0));
  181.     Terminal.WriteString (' < ');
  182.     Terminal.WriteString (StrConv.CardToStr (AllAvail(),0));
  183.     Terminal.WriteLn;
  184.     bl:= RootPtr;
  185.     empty:= TRUE;
  186.     LOOP
  187.       bl:= ADDRESS (bl^.blk.next);
  188.       IF bl = RootPtr THEN EXIT END;
  189.       empty:= FALSE;
  190.       wrabs (bl);
  191.       IF blkFull (bl) THEN
  192.         wr ('  <full>,  size: ');
  193.         wrrel (blkSize (bl));
  194.         (*
  195.           wr (' = ');
  196.           ad:= ADR (bl^.fullData);
  197.           wrrel (MemSize (ad));
  198.         *)
  199.         wr (', level: ');
  200.         wr (StrConv.IntToStr (bl^.level,5));
  201.         IF bl^.full # 0 THEN wr ('  full#0!') END;
  202.         wrln
  203.       ELSE
  204.         wr ('  size: ');
  205.         wrrel (blkSize (bl));
  206.         wr (',  avail: ');
  207.         wrrel (bl^.free);
  208.         wrln;
  209.         freeBeg:= 0;            (* End of last used area *)
  210.         usedBeg:= bl^.hd.n;     (* Start of new used area *)
  211.         LOOP
  212.           IF usedBeg < 0 THEN
  213.             (* rest ist höchstens frei *)
  214.             l:= VAL (INTEGER, blkSize (bl)) - freeBeg;
  215.             IF l > 0 THEN
  216.               wr ('        free: '); wrrel (l); wrln
  217.             END;
  218.             EXIT
  219.           ELSE
  220.             l:= usedBeg - freeBeg;
  221.             IF l > 0 THEN
  222.               wr ('        free: '); wrrel (l); wrln
  223.             END
  224.           END;
  225.           wr ('        used: '); wrrel (sizeHd (bl, usedBeg));
  226.           hd:= abs (bl, usedBeg);
  227.           (*
  228.             wr (' = ');
  229.             ad:= ADR (hd^.data);
  230.             wrrel (MemSize (ad));
  231.           *)
  232.           wr (', level: ');
  233.           wr (StrConv.IntToStr (hd^.level,5));
  234.           wrln;
  235.           freeBeg:= usedBeg + HeadSize + sizeHd (bl, usedBeg);
  236.           usedBeg:= nextHd (bl, usedBeg)
  237.         END
  238.       END;
  239.       Terminal.Read (ch)
  240.     END;
  241.     IF empty THEN
  242.       wr ('Empty!');
  243.     END;
  244.     wrln;
  245.     Terminal.WriteString ('Press ESC:');
  246.     REPEAT Terminal.Read (ch) UNTIL ch = CHR(27);
  247.   END showLinks;
  248.  
  249. BEGIN
  250.   More ($4EF3, ADR (RootPtr));
  251.   More ($4EF4, ADR (Verify));
  252.   showLinks;
  253. END NewStorTest.
  254.  
  255.